package com.yc.thread.basic;

import java.util.Random;

/**
 * synchronized 对象锁
 * wait()  让当前线程进入等待状态  释放锁  等待其他线程唤醒
 * notifyAll()  唤醒等待队列中的所有线程
 *
 * @author zwei
 * @create 2024-07-15 10:36
 */
public class Test15_ticket {
    public static void main(String[] args) {
        SellTicketOp op = new SellTicketOp(300);
        for (int i = 0; i < 50; i++) {
            Thread t1 = new Thread(op, "售票员" + (i + 1));
            t1.start();
        }
    }
}

//收票任务
class SellTicketOp implements Runnable {
    int tickets;    //票数
    Random r = new Random();

    //构造方法完成初始化
    public SellTicketOp(int tickets) {
        this.tickets = tickets;
    }

    @Override
    public synchronized void run() {
        //循环票
        while (true) {
            //判断是否有票
//            synchronized (this) {     //this->ShellTicketOp类的对象
            if (this.tickets > 0) {
                System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票");
                try {
//                      Thread.sleep(r.nextInt(40));    //sleep()当前线程休眠 不会释放锁
                    wait(r.nextInt(4));    //当前线程等待  释放锁-->其他线程就可以争抢锁 节省等待时间
                    //以上程序为什么不结束？   wait状态的线程在等待队列，没有唤醒的话就会一直等待
                    this.notifyAll();   //notifyAll()唤醒等待队列中的所有线程
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            } else {
                return;
            }
//            }
        }

    }
}
